package fifteenth.Java反射机制的深入应用;

import java.lang.reflect.Field;

/**
 * 在反射操作中虽然可以用Method调用类中的setter及getter方法设置和取得属性
 * 但是这样操作毕竟很麻烦，所以在反射机制中也可以直接通过Field类操作类中的属性，
 * 通过Field类提供的set()和get()方法就可以完成设置和取得属性内容的操作。
 * 但是在操作前首先要注意的是，
 * 在类中的所有属性已经都设置成私有的访问权限，
 * 所以在使用set()或get()方法的时候首先先使用Field类中的setAccessible(true)方法将需要操作的属性设置成可以被外部访问。
 *
 */
public class 通过反射操作类中的属性 {
    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchFieldException {
        Class<?> c = Class.forName("fifteenth.取得类的结构.Person");
        Object o = c.newInstance();
        Field nameField =o.getClass().getDeclaredField("name");
        Field ageField=o.getClass().getDeclaredField("age");
        nameField.setAccessible(true);
        ageField.setAccessible(true);
        nameField.set(o,"擎天柱");
        ageField.set(o,8888);
        System.out.println("姓名："+nameField.get(o));
        System.out.println("年龄："+ageField.get(o));
    }
}
/**
 * 上面的代码比之前用setter和getter方法方便多了
 *
 * 注意：使用反射操作属性时最好通过setter及getter方法
 * 上面的程序属于直接扩大类属性的访问权限后直接操作属性，所以在Person类中并不需要编写setter和getter方法，
 * 但是在开发中调用属性的时候都要使用setter和geetter方法，
 * 所以读者以后开发时候要注意：不要直接直接操作属性，而是通过setter和getter方法调用
 */
/*
D:\WorkSpaces\Java\jdk-21\bin\java.exe "-javaagent:D:\Software\IntelliJ IDEA\IntelliJ IDEA 2023.3.2\lib\idea_rt.jar=54520:D:\Software\IntelliJ IDEA\IntelliJ IDEA 2023.3.2\bin" -Dfile.encoding=UTF-8 -Dsun.stdout.encoding=UTF-8 -Dsun.stderr.encoding=UTF-8 -classpath D:\WorkSpaces\JavaDevelopBase_start_329\out\production\JavaDevelopBase_start_329 fifteenth.Java反射机制的深入应用.通过反射操作类中的属性
姓名：擎天柱
年龄：8888

Process finished with exit code 0

 */
